package com.itcam.generator;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

/**
 * @author : Cammy.Wu
 * Description : 
 */

public class StaticGenerator {

    /**
     * 使用 Hutool 库拷贝文件。
     * 该方法将输入目录完整拷贝到输出目录下。
     *
     * @param inputPath  输入目录的路径
     * @param outputPath 输出目录的路径
     */
    public static void copyFilesByHutool(String inputPath, String outputPath) {
        // 使用 Hutool 的 FileUtil.copy 方法进行文件拷贝
        // 参数 false 表示不覆盖已存在的文件
        FileUtil.copy(inputPath, outputPath, false);
        /*
        inputPath：源文件或目录的路径。这是你想要复制的文件或目录的位置。
        outputPath：目标文件或目录的路径。这是你想要将源文件或目录复制到的位置。
        false：这个参数表示是否覆盖已存在的文件。
                如果设置为false，则在目标位置已经存在同名文件时，
                不会进行覆盖，而是保留原文件。如果设置为true，则
                会覆盖已存在的文件。
         */
    }


    /**
     * 递归拷贝文件（递归实现，会将输入目录完整拷贝到输出目录下）
     * @param inputPath
     * @param outputPath
     */
    public static void copyFilesByRecursive(String inputPath, String outputPath) {
        // 创建输入文件对象
        File inputFile = new File(inputPath);
        // 创建输出文件对象
        File outputFile = new File(outputPath);
        try {
            // 调用递归拷贝文件的方法
            copyFileByRecursive(inputFile, outputFile);
        } catch (Exception e) {
            // 捕获异常并打印错误信息
            System.err.println("文件复制失败");
            // 打印异常堆栈跟踪
            e.printStackTrace();
        }

    }

    /**
     * 文件 A => 目录 B，则文件 A 放在目录 B 下
     * 文件 A => 文件 B，则文件 A 覆盖文件 B
     * 目录 A => 目录 B，则目录 A 放在目录 B 下
     *
     * 核心思路：先创建目录，然后遍历目录内的文件，依次复制
     * @param src
     * @param dest
     * @throws IOException
     */
    private static void copyFileByRecursive(File src, File dest) throws IOException {
        // 区分是文件还是目录
        if (src.isDirectory()) {
            System.out.println(src.getName());
            File destOutputFile = new File(dest, src.getName());
            // 如果是目录，首先创建目标目录
            if (!destOutputFile.exists()) {
                destOutputFile.mkdirs();
            }
            // 获取目录下的所有文件和子目录
            File[] files = src.listFiles();
            // 无子文件，直接结束
            if (ArrayUtil.isEmpty(files)) {
                return;
            }
            for (File file : files) {
                // 递归拷贝下一层文件
                copyFileByRecursive(file, destOutputFile);
            }
        } else {
            // 是文件，直接复制到目标目录下
            Path destPath = dest.toPath().resolve(src.getName());
            Files.copy(src.toPath(), destPath, StandardCopyOption.REPLACE_EXISTING);
        }
    }


}
